﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using DOHS_WM6.Schemas;
using Log = DOHS_WM6.Schemas.Log;

namespace DOHS_WM6.Classes
{
    public class ControleDados
    {
        #region Constantes
        public const string FALSE = "0";
        public const string TRUE = "1";
        public const string logPath = @"Program Files\DOHS_WM6\Levantamentos\Log\logDOHS.oms";
        #endregion

        #region Propriedades
        private MensagemDOHS mensagemDOHS { get; set; }
        private Log.LogDOHS logDOHS { get; set; }
        #endregion

        #region Propriedades Estaticas
        /// <summary>
        /// Caminho do arquivo xml do levantamento
        /// </summary>
        public static string LevantamentoPath { get; private set; }

        /// <summary>
        /// Fichas Selecionadas para gravar no Log ou recuperar informacao para Continuar Levantamento
        /// </summary>
        public static Log.ct_FichasSelecionadas FichasSelecionadas { get; private set; }

        /// <summary>
        /// FichaDOHS que está sendo preenchida
        /// </summary>
        public static MensagemDOHSFicha FichaDOHS { get; private set; }

        #endregion

        #region Construtor
        public ControleDados()
        {

        }
        #endregion

        #region Metodos
        
        #region Log
        /// <summary>
        /// Carrega dados dos formularios no objeto de log
        /// </summary>
        /// <returns>Objeto Log com dados carregados</returns>
        private Log.LogDOHSLog CarregaDadosLog()
        {
            //Populando dados do novo Log
            Log.LogDOHSLog log = new DOHS_WM6.Schemas.Log.LogDOHSLog();
            //Cabecalho
            log.Cabecalho = new DOHS_WM6.Schemas.Log.ct_Cabecalho();
            log.Cabecalho.CodExaminador = ControleFormularios.frmCabecalho.txtCodigoExaminador.Text;
            log.Cabecalho.DataLevantamento = ControleFormularios.frmCabecalho.dtpDataExame.Value.ToString("dd/MM/yyyy");
            log.Cabecalho.LocalizacaoGeografica = ControleFormularios.frmCabecalho.txtLocalizacaoGeografica.Text;
            log.Cabecalho.TipoLocalizacao = ControleFormularios.frmCabecalho.txtTipoLocalizacao.Text;
            //Path
            log.Path = ControleDados.LevantamentoPath;
            //Guias Selecionadas
            log.FichasSelecionadas = new DOHS_WM6.Schemas.Log.ct_FichasSelecionadas();
            log.FichasSelecionadas.AnormalidadeDentofacial = (ControleFormularios.frmCabecalho.frmSelecaoFicha2.chbAnomaliasDentofaciais.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.AvaliacaoArticulacaoTemporoMandibular = (ControleFormularios.frmCabecalho.frmSelecaoFicha1.chbAvalArtTemporo.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.CondicaoDentaria = (ControleFormularios.frmCabecalho.frmSelecaoFicha2.chbCondicoesDentarias.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.CondicaoProtetica = (ControleFormularios.frmCabecalho.frmSelecaoFicha2.chbCondicoesProteticas.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.ExameExtraBucal = (ControleFormularios.frmCabecalho.frmSelecaoFicha1.chbExameExtraBucal.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.FluoroseDentaria = (ControleFormularios.frmCabecalho.frmSelecaoFicha1.chbFluoroseDentaria.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.IPC = (ControleFormularios.frmCabecalho.frmSelecaoFicha1.chbIPC.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.MucosaBucal = (ControleFormularios.frmCabecalho.frmSelecaoFicha1.chbMucosaBucal.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.NecessidadeCuidado = (ControleFormularios.frmCabecalho.frmSelecaoFicha2.chbNecessidadeCuidados.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.NecessidadeProtese = (ControleFormularios.frmCabecalho.frmSelecaoFicha2.chbNecessidadeProtese.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.OpacidadeHipoplasia = (ControleFormularios.frmCabecalho.frmSelecaoFicha1.chbOpacidade.Checked ? TRUE : FALSE);
            log.FichasSelecionadas.PerdaInsercao = (ControleFormularios.frmCabecalho.frmSelecaoFicha2.chbPerdaInsercao.Checked ? TRUE : FALSE);

            return log;
        }
        /// <summary>
        /// Carrega quais fichas foram selecionadas para continuar levantamento
        /// </summary>
        /// <param name="log">Log selecionado para continuar levantamento</param>
        private void CarregaFichasSelecionadas(Log.LogDOHSLog log)
        {
            ControleDados.FichasSelecionadas = log.FichasSelecionadas;
        }

        /// <summary>
        /// Carrega lista de logs gravado no XML
        /// </summary>
        /// <returns>Retorna uma lista com todos os logs gravados em XML</returns>
        public List<Log.LogDOHSLog> CarregaListaLog()
        {
            try
            {
                this.VerificaArquivoLogDOHS();
                //Deserealiza Arquivo de Log
                this.logDOHS = (Log.LogDOHS)DeserializaXML(new StreamReader(logPath), typeof(Log.LogDOHS));
                return new List<DOHS_WM6.Schemas.Log.LogDOHSLog>(logDOHS.Log);
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao carregar lista de log - \n" + e.Message, e.InnerException);
            }
        }
        #endregion

        #region Levantamento
        /// <summary>
        /// Cria arquivo XML incial do levantamento e grava no arquivo de log
        /// </summary>
        public void IniciarLevantamento()
        {
            this.VerificaArquivoLogDOHS();
            //Deserealiza Arquivo de Log
            try
            {
                this.logDOHS = (Log.LogDOHS)DeserializaXML(new StreamReader(logPath), typeof(Log.LogDOHS));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao Pegar informacoes do arquivo de log - \n" + e.Message, e.InnerException);
            }

            //Cria nome do Arquivo XML do Levantamento
            ControleDados.LevantamentoPath = @"Program Files\DOHS_WM6\Levantamentos\msgDOHS" + "_" +
                                            ControleFormularios.frmCabecalho.txtCodigoExaminador.Text + "_" +
                                            ControleFormularios.frmCabecalho.txtLocalizacaoGeografica.Text + "_" +
                                            ControleFormularios.frmCabecalho.txtTipoLocalizacao.Text + "_" +
                                            DateTime.Now.ToString("ddMMyyyyhhmmss") + ".oms";
            
            //Carrega Dados do Log em um objeto para Serializar
            Log.LogDOHSLog novoLog = CarregaDadosLog();
            //Carrega Fichas Selecionadas
            this.CarregaFichasSelecionadas(novoLog);

            //Cria Arquivo do Levantamento
            try
            {
                //Serializa Levantamento
                this.CriaLevantamento(novoLog);
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao criar arquivo do levantamento - \n" + e.Message, e.InnerException);
            }

            //Cria Lista de Logs
            List<Log.LogDOHSLog> listaLog = new List<DOHS_WM6.Schemas.Log.LogDOHSLog>();
            //Adiciona Logs anteriores na lista
            if (logDOHS.Log != null)
                listaLog.AddRange(logDOHS.Log);
            //Adiciona o Novo Log na lista
            listaLog.Add(novoLog);
            //Adiciona Lista de Logs no Objeto Log que será Serealizado
            this.logDOHS.Log = listaLog.ToArray();

            try
            {
                //Serealiza Log
                this.SerializaXML(this.logDOHS, logPath);
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao Gravar Log - \n" + e.Message, e.InnerException);
            } 
        }

        /// <summary>
        /// Carrega arquivo XML para continuar levantamento e grava alterações no arquivo de log
        /// </summary>
        /// <param name="indiceLog"></param>
        public void ContinuarLevantamento(int indiceLog)
        {
            //Deserealiza Arquivo de Log
            try
            {
                this.logDOHS = (Log.LogDOHS)DeserializaXML(new StreamReader(logPath), typeof(Log.LogDOHS));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao Pegar informacoes do arquivo de log - \n" + e.Message, e.InnerException);
            }

            //Carrega caminho do Arquivo XML do Levantamento
            ControleDados.LevantamentoPath = this.logDOHS.Log[indiceLog].Path;

            //Carrega Dados do Log em um objeto para Serializar
            Log.LogDOHSLog novoLog = CarregaDadosLog();
            //Carrega Fichas Selecionadas
            this.CarregaFichasSelecionadas(novoLog);


            //Seta Log modificado
            logDOHS.Log[indiceLog] = novoLog;

            try
            {
                //Serealiza Log
                this.SerializaXML(this.logDOHS, logPath);
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao Gravar Log - \n" + e.Message, e.InnerException);
            }
        }

        #endregion

        #region Ficha
        /// <summary>
        /// Cria arquivo XML do levantamento
        /// </summary>
        /// <param name="novoLog"></param>
        private void CriaLevantamento(Log.LogDOHSLog novoLog)
        {
            this.mensagemDOHS = new MensagemDOHS();
            //Cabecalho
            this.mensagemDOHS.Cabecalho = new ct_Cabecalho();
            this.mensagemDOHS.Cabecalho.CodExaminador = novoLog.Cabecalho.CodExaminador;
            this.mensagemDOHS.Cabecalho.DataLevantamento = novoLog.Cabecalho.DataLevantamento;
            this.mensagemDOHS.Cabecalho.LocalizacaoGeografica = novoLog.Cabecalho.LocalizacaoGeografica;
            this.mensagemDOHS.Cabecalho.TipoLocalizacao = novoLog.Cabecalho.TipoLocalizacao;
            //LoteGuias Vazio
            this.mensagemDOHS.LoteFichas = new MensagemDOHSFicha[0];
            //Verifica se arquivo já existe, se existir sobrescreve o arquivo antigo
            if (File.Exists(ControleDados.LevantamentoPath))
                File.Create(ControleDados.LevantamentoPath);
            //Serealiza Arquivo inicial do Levantamento
            this.SerializaXML(this.mensagemDOHS, ControleDados.LevantamentoPath);
        }

        /// <summary>
        /// Instancia uma nova Ficha para cadastrar
        /// </summary>
        public void NovaFichaDOHS()
        {
            //Instancia uma nova ficha
            ControleDados.FichaDOHS = new MensagemDOHSFicha();

            #region Informacoes Gerais
            ControleDados.FichaDOHS.InformacaoGeral = new ct_InformacaoGeral();

            ControleDados.FichaDOHS.InformacaoGeral.Identificacao = "0000";
            ControleDados.FichaDOHS.InformacaoGeral.DataNascimento = new ct_InformacaoGeralDataNascimento();
            ControleDados.FichaDOHS.InformacaoGeral.DataNascimento.Value = DateTime.Now.ToString("dd/MM/yyyy");
            ControleDados.FichaDOHS.InformacaoGeral.DataNascimento.atb_Idade = FALSE;
            ControleDados.FichaDOHS.InformacaoGeral.Sexo = TRUE;
            ControleDados.FichaDOHS.InformacaoGeral.Ocupacao = FALSE;
            ControleDados.FichaDOHS.InformacaoGeral.GrupoEtnico = FALSE;
            ControleDados.FichaDOHS.InformacaoGeral.Duplicata = FALSE;

            #endregion

            #region Avaliacao Clinica
            ControleDados.FichaDOHS.AvaliacaoClinica = new MensagemDOHSFichaAvaliacaoClinica();

            #region AnormalidadeDentofacial
            if (ControleDados.FichasSelecionadas.AnormalidadeDentofacial.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial = new ct_AnormalidadeDentofacial();

                //Denticao
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Denticao = "00";
                //Espaco
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Espaco = new ct_Espaco();
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Espaco.Apinhamento = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Espaco.Diastema = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Espaco.Espacamento = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Espaco.IrregularidadeInferior = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Espaco.IrregularidadeSuperior = FALSE;
                //Oclusao
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Oclusao = new ct_Oclusao();
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Oclusao.MordidaAbertaVerticalAnterior = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Oclusao.OverjetMandibularAnterior = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Oclusao.OverjetMaxilarAnterior = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AnormalidadeDentofacial.Oclusao.RelacaoMolarAnteroPosterior = FALSE;
            }
            #endregion AvaliacaoArticulacaoTemporoMandibular

            #region AvaliacaoArticulacaoTemporoMandibular
            if (ControleDados.FichasSelecionadas.AvaliacaoArticulacaoTemporoMandibular.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.AvaliacaoArticulacaoTemporoMandibular = new ct_AvaliacaoArticulacaoTemporoMandibular();

                //Sintomas
                ControleDados.FichaDOHS.AvaliacaoClinica.AvaliacaoArticulacaoTemporoMandibular.Sintomas = new ct_AvaliacaoArticulacaoTemporoMandibularSintomas();
                ControleDados.FichaDOHS.AvaliacaoClinica.AvaliacaoArticulacaoTemporoMandibular.Sintomas.atb_Sintomas = FALSE;
                //Sinais
                ControleDados.FichaDOHS.AvaliacaoClinica.AvaliacaoArticulacaoTemporoMandibular.Sintomas.Estalido = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AvaliacaoArticulacaoTemporoMandibular.Sintomas.MobilidadeMandibularReduzida = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.AvaliacaoArticulacaoTemporoMandibular.Sintomas.SensibilidadePalpacao = FALSE;
            }
            #endregion

            #region CondicaoDentaria
            if (ControleDados.FichasSelecionadas.CondicaoDentaria.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria = new ct_CondicaoDentaria();
                #region 1 Quadrante
                //Dente 11_51
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_11_51 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_11_51.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_11_51.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_11_51.Tratamento = FALSE;
                //Dente 12_52
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_12_52 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_12_52.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_12_52.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_12_52.Tratamento = FALSE;
                //Dente 13_53
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_13_53 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_13_53.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_13_53.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_13_53.Tratamento = FALSE;
                //Dente 14_54
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_14_54 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_14_54.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_14_54.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_14_54.Tratamento = FALSE;
                //Dente 15_55
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_15_55 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_15_55.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_15_55.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_15_55.Tratamento = FALSE;
                //Dente 16
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_16 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_16.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_16.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_16.Tratamento = FALSE;
                //Dente 17
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_17 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_17.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_17.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_17.Tratamento = FALSE;
                //Dente 18
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_18 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_18.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_18.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_18.Tratamento = FALSE;
                #endregion
                
                #region 2 Quadrante
                //Dente 21_61
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_21_61 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_21_61.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_21_61.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_21_61.Tratamento = FALSE;
                //Dente 22_62
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_22_62 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_22_62.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_22_62.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_22_62.Tratamento = FALSE;
                //Dente 23_63
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_23_63 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_23_63.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_23_63.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_23_63.Tratamento = FALSE;
                //Dente 24_64
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_24_64 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_24_64.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_24_64.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_24_64.Tratamento = FALSE;
                //Dente 25_65
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_25_65 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_25_65.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_25_65.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_25_65.Tratamento = FALSE;
                //Dente 26
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_26 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_26.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_26.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_26.Tratamento = FALSE;
                //Dente 27
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_27 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_27.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_27.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_27.Tratamento = FALSE;
                //Dente 28
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_28 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_28.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_28.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_28.Tratamento = FALSE;
                #endregion

                #region 3 Quadrante
                //Dente 31_71
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_31_71 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_31_71.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_31_71.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_31_71.Tratamento = FALSE;
                //Dente 32_72
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_32_72 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_32_72.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_32_72.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_32_72.Tratamento = FALSE;
                //Dente 33_73
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_33_73 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_33_73.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_33_73.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_33_73.Tratamento = FALSE;
                //Dente 34_74
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_34_74 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_34_74.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_34_74.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_34_74.Tratamento = FALSE;
                //Dente 35_75
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_35_75 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_35_75.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_35_75.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_35_75.Tratamento = FALSE;
                //Dente 36
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_36 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_36.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_36.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_36.Tratamento = FALSE;
                //Dente 37
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_37 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_37.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_37.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_37.Tratamento = FALSE;
                //Dente 38
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_38 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_38.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_38.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_38.Tratamento = FALSE;
                #endregion

                #region 4 Quadrante
                //Dente 41_81
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_41_81 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_41_81.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_41_81.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_41_81.Tratamento = FALSE;
                //Dente 42_82
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_42_82 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_42_82.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_42_82.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_42_82.Tratamento = FALSE;
                //Dente 43_83
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_43_83 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_43_83.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_43_83.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_43_83.Tratamento = FALSE;
                //Dente 44_84
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_44_84 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_44_84.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_44_84.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_44_84.Tratamento = FALSE;
                //Dente 45_85
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_45_85 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_45_85.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_45_85.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_45_85.Tratamento = FALSE;
                //Dente 46
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_46 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_46.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_46.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_46.Tratamento = FALSE;
                //Dente 47
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_47 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_47.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_47.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_47.Tratamento = FALSE;
                //Dente 48
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_48 = new ct_AvaliacaoCondicaoDentaria();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_48.Coroa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_48.Raiz = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicaoDentaria.dente_48.Tratamento = FALSE;
                #endregion
            }
            #endregion

            #region CondicaoProtetica
            if (ControleDados.FichasSelecionadas.CondicaoProtetica.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicoesProteticas = new ct_CondicaoProtetica();
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicoesProteticas.Superior = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.CondicoesProteticas.Inferior = FALSE;
            }
            #endregion

            #region ExameExtraBucal
            if (ControleDados.FichasSelecionadas.ExameExtraBucal.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.ExameExtraBucal = FALSE;
            }
            #endregion

            #region FluoroseDentaria
            if (ControleDados.FichasSelecionadas.FluoroseDentaria.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.FluoroseDentaria = FALSE;
            }
            #endregion

            #region IPC
            if (ControleDados.FichasSelecionadas.IPC.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.IPC = new ct_Periodontal();
                ControleDados.FichaDOHS.AvaliacaoClinica.IPC.dente_11 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.IPC.dente_17_16 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.IPC.dente_26_27 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.IPC.dente_31 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.IPC.dente_36_37 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.IPC.dente_47_46 = FALSE;
            }
            #endregion

            #region MucosaBucal
            if (ControleDados.FichasSelecionadas.MucosaBucal.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal = new ct_MucosaBucal();
                //Condicao 1
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Condicao1 = new ct_CondicaoMucosaBucal();
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Condicao1.CondicaoMucosa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Localizacao1 = "9";
                //Condicao 2
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Condicao2 = new ct_CondicaoMucosaBucal();
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Condicao2.CondicaoMucosa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Localizacao2 = "9";
                //Condicao 3
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Condicao3 = new ct_CondicaoMucosaBucal();
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Condicao3.CondicaoMucosa = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.MucosaBucal.Localizacao3 = "9";
            }
            #endregion

            #region NecessidadeCuidado
            if (ControleDados.FichasSelecionadas.NecessidadeCuidado.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeCuidado = new ct_NecessidadeCuidados();
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeCuidado.CondicaoPotencialmenteFatal = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeCuidado.DorInfeccao = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeCuidado.Encaminhamento = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeCuidado.OutrasCondicoes = new ct_NecessidadeCuidadosOutrasCondicoes();
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeCuidado.OutrasCondicoes.Value = FALSE;
            }
            #endregion

            #region NecessidadeProtese
            if (ControleDados.FichasSelecionadas.NecessidadeProtese.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeProtese = new ct_NecessidadeProtese();
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeProtese.Superior = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.NecessidadeProtese.Inferior = FALSE;
            }
            #endregion

            #region OpacidadeHipoplasia
            if (ControleDados.FichasSelecionadas.OpacidadeHipoplasia.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia = new ct_OpacidadeHipoplasia();
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_11 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_12 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_13 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_14 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_21 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_22 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_23 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_24 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_36 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.OpacidadeHipoplasia.dente_46 = FALSE;
            }
            #endregion

            #region OpacidadeHipoplasia
            if (ControleDados.FichasSelecionadas.PerdaInsercao.Equals(TRUE))
            {
                ControleDados.FichaDOHS.AvaliacaoClinica.PerdaInsercao = new ct_Periodontal();
                ControleDados.FichaDOHS.AvaliacaoClinica.PerdaInsercao.dente_11 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.PerdaInsercao.dente_17_16 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.PerdaInsercao.dente_26_27 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.PerdaInsercao.dente_31 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.PerdaInsercao.dente_36_37 = FALSE;
                ControleDados.FichaDOHS.AvaliacaoClinica.PerdaInsercao.dente_47_46 = FALSE;
            }
            #endregion
            #endregion
        }

        /// <summary>
        /// Grava a nova ficha em XML
        /// </summary>
        public void GravarFichaDOHS(bool NovaFicha)
        {
            try
            {
                //Carrega Arquivo do Levantamento Atual
                MensagemDOHS msgDOHS = (MensagemDOHS)DeserializaXML(new StreamReader(ControleDados.LevantamentoPath), typeof(MensagemDOHS));

                //Cria lista de Fichas do Levantamento Atual
                List<MensagemDOHSFicha> listaFichas = new List<MensagemDOHSFicha>();

                //Insere as Fichas Preenchidas do Levantamento na lita de Fichas
                if (msgDOHS.LoteFichas != null)
                    listaFichas.AddRange(msgDOHS.LoteFichas);

                if (NovaFicha)
                {
                    //Insere a nova ficha na lista de fichas do levantamento
                    listaFichas.Add(ControleDados.FichaDOHS);
                }
                else
                { 
                    //Procura ficha a ser alterada
                    foreach (MensagemDOHSFicha ficha in listaFichas.GetRange(0, listaFichas.Count))
                    {
                        if (ficha.InformacaoGeral.Identificacao.Equals(ControleDados.FichaDOHS.InformacaoGeral.Identificacao) && ficha.InformacaoGeral.Duplicata.Equals(FALSE))
                        {
                            listaFichas[listaFichas.IndexOf(ficha)] = ControleDados.FichaDOHS;
                        }
                    }
                }

                //Insere Lista de Fichas no Lote de Fichas do Objeto para ser serializado novamente
                msgDOHS.LoteFichas = listaFichas.ToArray();

                //Serializa Levantamento
                SerializaXML(msgDOHS, ControleDados.LevantamentoPath);
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao Gravar Levantamento - \n" + e.Message, e.InnerException);
            }
            
        }

        /// <summary>
        /// Busca uma Ficha já preenchida para alteracoes
        /// </summary>
        /// <param name="id">Identificacao do Paciente</param>
        public bool BuscarFichaDOHS(string id)
        {
            try
            {
                //Carrega Arquivo do Levantamento Atual
                MensagemDOHS msgDOHS = (MensagemDOHS)DeserializaXML(new StreamReader(ControleDados.LevantamentoPath), typeof(MensagemDOHS));

                //Cria lista de Fichas do Levantamento Atual
                List<MensagemDOHSFicha> listaFichas = new List<MensagemDOHSFicha>();

                //Insere as Fichas Preenchidas do Levantamento na lita de Fichas
                if (msgDOHS.LoteFichas != null)
                    listaFichas.AddRange(msgDOHS.LoteFichas);

                //Procura Ficha com Identificacao igual e que nao seja duplicata
                foreach (MensagemDOHSFicha ficha in listaFichas)
                {
                    if (ficha.InformacaoGeral.Identificacao.Equals(id) && ficha.InformacaoGeral.Duplicata.Equals(FALSE))
                    {
                        ControleDados.FichaDOHS = ficha;
                        return true;
                    }
                }
                
                return false;
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao Buscar Ficha - \n" + e.Message, e.InnerException);
            }
        }
        #endregion

        #region XML Utils
        /// <summary>
        /// Serializa um objeto DOHS para XML
        /// </summary>
        /// <param name="objetoDOHS">Objeto a ser Serializado</param>
        /// <param name="path">Caminho do arquivo</param>
        private void SerializaXML(object objetoDOHS, string path)
        {
            XmlSerializer serializer = new XmlSerializer(objetoDOHS.GetType());

            try
            {
                Stream serializaStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);

                // Serializa o objeto
                XmlTextWriter writer = new XmlTextWriter(serializaStream, Encoding.GetEncoding("utf-8"));
                serializer.Serialize(writer, objetoDOHS);
                serializaStream.Close();
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao Serializar Arquivo XML do tipo - " + objetoDOHS.GetType().ToString() + " na pasta: \n" + path + "\n" + e.Message, e.InnerException);
            }
        }

        /// <summary>
        /// Deserializa um objeto DOHS para XML
        /// </summary>
        /// <param name="objetoDOHS">Objeto a ser Deserializado</param>
        /// <param name="tipoObjeto">Caminho do arquivo</param>
        /// <returns></returns>
        private object DeserializaXML(StreamReader objetoDOHS, Type tipoObjeto)
        {
            object retorno = null;

            XmlSerializer serializer = new XmlSerializer(tipoObjeto);

            try
            {
                // Deserializa o objeto
                retorno = serializer.Deserialize(objetoDOHS);
                objetoDOHS.Close();
                return retorno;
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao Deserializar objeto - \n" + ex.Message, ex.InnerException);
            }
        }

        /// <summary>
        /// Verifica se arquivo log existe, senão cria um novo arquivo Log DOHS
        /// </summary>
        private void VerificaArquivoLogDOHS()
        {
            if (!File.Exists(logPath))
            {
                try
                {
                    Log.LogDOHS novoLog = new DOHS_WM6.Schemas.Log.LogDOHS();
                    novoLog.Log = new DOHS_WM6.Schemas.Log.LogDOHSLog[0];
                    this.SerializaXML(novoLog, logPath);
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao Criar Arquivo de LogDOHS - \n" + e.Message, e.InnerException); ;
                }
            }
        }
        #endregion

        #endregion
    }
}
